package cn.demoncat.util.mybatis.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * BaseDao 
 * 
 * @author 延晓磊
 *
 * @since 2016年3月16日
 * 
 * @see <a href="https://mybatis.org/mybatis-3/zh/index.html">Mybatis</a>
 */
public interface BaseDao<T extends BaseEntity<T,P>, P extends Serializable> {

	/**
	 * 添加
	 * 
	 * 1、如果属性为null，将赋值字段为null或报错cannot be null，不会使用数据库默认值；建议在程序中赋默认值
	 * 2、如果赋值ID，使用自定义ID；如果ID为null，使用数据库自增
	 * 3、更新后可以通过o.getId()获取主键
	 * 4、如果使用INSERT INTO，插入失败时抛异常；如果使用INSERT IGNORE INTO，成功返回1，失败返回0
	 * 
	 * @param o
	 * @return 插入的记录数
	 */
	int save(T o);
	
	/**
	 * 批量添加
	 * 
	 * 1、如果属性为null，将赋值字段为null或报错cannot be null，不会使用数据库默认值；建议在程序中赋默认值
	 * 2、如果赋值ID，使用自定义ID；如果ID为null，使用数据库自增
	 * 3、更新后可以通过o.getId()获取主键
	 * 4、如果使用INSERT INTO，插入失败时抛异常；如果使用INSERT IGNORE INTO，成功返回1，失败返回0
	 * 
	 * @param os
	 * @return 插入的记录数
	 */
	int batchSave(List<T> os);
	
	/**
	 * 删除
	 * 
	 * 1、根据id删除
	 * 2、根据id和其它条件删除
	 * 3、根据ids删除
	 * 4、根据ids和其它条件删除
	 * 
	 * @param condition {id,ids,其它字段}
	 * 
	 * @return 删除的记录数
	 */
	int delete(Map<String, Object> condition);
	 
	/**
	 * 更新(排除null)
	 * 
	 * @param o  
	 * @return 更新的记录数
	 */
	int update(T o);
	
	/**
	 * 条件更新(排除null)
	 * 
	 * @param params   {obj,condition}
	 * @return 更新的记录数
	 */
	int updateByCondition(Map<String,Object> params);
	
	/**
	 * 批量更新(排除null)
	 * 
	 * @param objs
	 */
	void batchUpdate(List<T> objs);
 
	/**
	 * 批量条件更新(排除null)
	 * 
	 * @param params{objs,condition}
	 */
	void batchUpdateByCondition(Map<String,Object> params);
	 
	/**
	 * 
	 * 统一字段更新(排除null)
	 * 
	 * 1、obj为统一更新的属性名和值，condition为更新条件
	 * 2、不能更新ID
	 * 
	 * @param params {obj{属性名:属性值},condition{条件字段名:值, ids:[id]}}
	 * @return 更新的记录数           
	 */
	int updateFields(Map<String,Object> params);
	
	/**
	 * 更新(不排除null)
	 * 
	 * @param o  
	 * @return 更新的记录数
	 */
	int fullUpdate(T o);
	
	/**
	 * 条件更新(不排除null)
	 * 
	 * @param params   {obj,condition}
	 * @return 更新的记录数
	 */
	int fullUpdateByCondition(Map<String,Object> params);
	
	/**
	 * 批量更新(不排除null)
	 * 
	 * @param objs
	 */
	void batchFullUpdate(List<T> objs);
 
	/**
	 * 批量条件更新(不排除null)
	 * 
	 * @param params{objs,condition}
	 */
	void batchFullUpdateByCondition(Map<String,Object> params);
	 
	/**
	 * 通过ID查询对象
	 * 
	 * @param id
	 * @return 单个对象
	 */
	T getById(P id);
	
	/**
	 * 通过ID查询对象(悲观锁)
	 * 
	 * @param id
	 * @return 单个对象
	 */
	T getForUpdate(P id);

	/**
	 * 根据查询条件统计总条数
	 * 
	 * @param condition  {条件字段，ids}
	 * @return 记录数
	 */
	long countByCondition(Map<String,Object> condition);

	/**
	 * 根据条件分页查询，返回对象集
	 * 
	 * @param condition {条件字段，ids，sortColumns:排序方式}
	 * @return 对象列表
	 */
	List<T> findByCondition(Map<String,Object> condition);
 
	/**
	 * 查询ID集
	 * 
	 * @param condition {条件字段，ids，sortColumns:排序方式}
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年3月19日
	 */
	List<P> findIds(Map<String, Object> condition);
}
